package com.luxsoft.siipap.migracion;

import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.springframework.beans.BeanWrapperImpl;

import com.luxsoft.siipap.model.core.Producto;

public class ImportadorDeProductos extends ImportadorGeneral{
	
	/**
	 * Actualiza el catalogo de productos en las propiedades indicadas
	 *  
	 * 
	 */
	public void actualizar(){
		//Leemos todos los articulos del DBF
		
		List<Producto> rows=getSourceJdbcTemplate().query(getSql(), getMapper());
		System.out.println("Productos Oracle: "+rows.size());
		List<Producto> beans=getUniversalDao().getAll(Producto.class);
		System.out.println("Productos MySql: "+beans.size());
		for(final Producto source:rows){
			final Producto target=(Producto) CollectionUtils.find(beans, new Predicate(){
				public boolean evaluate(Object input) {
					Producto pp=(Producto)input;
					return pp.getClave().trim().equals(source.getClave().trim());
				}
			});
			if(target!=null){
				ProductoMapper mapper=(ProductoMapper)getMapper();
				Map<String, String> map=mapper.getPropertyColumnMap();
				for(Map.Entry<String, String> entry:map.entrySet()){
					
					BeanWrapperImpl targetWrapper=new BeanWrapperImpl(target);
					BeanWrapperImpl sourceWrapper=new BeanWrapperImpl(source);
					targetWrapper.setPropertyValue(entry.getKey(), sourceWrapper.getPropertyValue(entry.getKey()));
					
				}
				Producto res=(Producto)getUniversalDao().save(target);
			}else{
				saveBean(source);
			}
				
		}
	}
	
	
	public void importar(String clave){
		String sql="select b.clave as UNIDAD,a.* from SW_ARTICULOS a left join sw_unidades b on (a.unidad_id=b.UNIDAD_ID) where a.clave=?";
		List rows=getSourceJdbcTemplate().query(sql,new Object[]{clave}, getMapper());
		if(!rows.isEmpty()){
			saveBean(rows.get(0));
		}
	}
	
	public void importarFaltantes(){
		String sql="select distinct clave as CLAVE from sw_articulos";
		List<String> source=getSourceJdbcTemplate().queryForList(sql, String.class);
		String sql2="select distinct clave from sx_productos";
		List<String> target=getTargetJdbcTemplate().queryForList(sql2, String.class);
		//Collection<String> faltantes=CollectionUtils.disjunction(source, target);
		
		for(String clave:source){
			if(!target.contains(clave)){
				System.out.println("Falta: "+clave);
				importar(clave);
			}
		}
	}

}
